
`timescale 1 ns / 10 ps

//  *************************************************************************
//  File : crc32galstep24c
//  *************************************************************************
//  This program is controlled by a written license agreement.
//  Unauthorized Reproduction or Use is Expressly Prohibited. 
//  Copyright [c] 2000 Morethanip
//  info@morethanip.com
//  *************************************************************************
//   Version:    $Id: crc32galstep24c.v,v 1.1 2009/07/09 00:23:23 dk Exp $
//   Author:     Morethanip, Daniel Koehler
//  *************************************************************************
//  Description:
// 
//  24 Bit Galois Field Multiplier
//  *************************************************************************

module crc32galstep24c (

   data,
   crc_in,
   crc_out);
   
input   [23:0] data;            //  new input data
input   [31:0] crc_in;          //  current CRC value
output  [31:0] crc_out;         //  new CRC value

wire    [31:0] crc_out; 
wire    [55:0] i; 
wire    [79:0] o1; 
wire    [31:0] o; 

assign crc_out = o;   

//  Level 1
//  gals26_24_1L1_4;
//  --------------

assign i = {data, crc_in}; 

assign o1[0] = i[14] ^ i[15] ^ i[18] ^ i[0];
assign o1[1] = i[16] ^ i[15] ^ i[19] ^ i[1];
assign o1[2] = i[0] ^ i[9] ^ i[13] ^ i[25];
assign o1[3] = i[14] ^ i[17] ^ i[20] ^ i[2];
assign o1[4] = i[16] ^ i[10] ^ i[0] ^ i[1];
assign o1[5] = i[17] ^ i[21] ^ i[3] ^ i[18];
assign o1[6] = i[2] ^ i[11] ^ i[15] ^ i[1];
assign o1[7] = i[22] ^ i[4] ^ i[16] ^ i[19];
assign o1[8] = i[3] ^ i[12] ^ i[18] ^ i[0];
assign o1[9] = i[23] ^ i[5] ^ i[20] ^ i[17];
assign o1[10] = i[4] ^ i[3] ^ i[13] ^ i[19];
assign o1[11] = i[6] ^ i[8] ^ i[21] ^ i[5];
assign o1[12] = i[20] ^ i[2] ^ i[4] ^ i[12];
assign o1[13] = i[7] ^ i[22] ^ i[9] ^ i[6];
assign o1[14] = i[16] ^ i[2] ^ i[3] ^ i[13];
assign o1[15] = i[14] ^ i[23] ^ i[10] ^ i[7];
assign o1[16] = i[17] ^ i[4] ^ i[8] ^ i[22];
assign o1[17] = i[14] ^ i[11] ^ i[0] ^ i[12];
assign o1[18] = i[23] ^ i[4] ^ i[5] ^ i[9];
assign o1[19] = i[18] ^ i[14] ^ i[1] ^ i[10];
assign o1[20] = i[5] ^ i[6] ^ i[13] ^ i[34];
assign o1[21] = i[15] ^ i[19] ^ i[2] ^ i[11];
assign o1[22] = i[0] ^ i[7] ^ i[14] ^ i[6];
assign o1[23] = i[20] ^ i[16] ^ i[3] ^ i[8];
assign o1[24] = i[15] ^ i[12] ^ i[1] ^ i[7];
assign o1[25] = i[17] ^ i[21] ^ i[4] ^ i[9];
assign o1[26] = i[13] ^ i[0] ^ i[2] ^ i[16];
assign o1[27] = i[22] ^ i[5] ^ i[17] ^ i[3];
assign o1[28] = i[18] ^ i[23] ^ i[19] ^ i[10];
assign o1[29] = i[14] ^ i[18] ^ i[5] ^ i[7];
assign o1[30] = i[15] ^ i[12] ^ i[6] ^ i[19];
assign o1[31] = i[20] ^ i[22] ^ i[1] ^ i[13];
assign o1[32] = i[18] ^ i[5] ^ i[7] ^ i[10];
assign o1[33] = i[11] ^ i[14] ^ i[17] ^ i[22];
assign o1[34] = i[23] ^ i[8] ^ i[11] ^ i[20];
assign o1[35] = i[3] ^ i[14] ^ i[19] ^ i[44];
assign o1[36] = i[21] ^ i[4] ^ i[9] ^ i[18];
assign o1[37] = i[21] ^ i[22] ^ i[5] ^ i[10];
assign o1[38] = i[0] ^ i[11] ^ i[23] ^ i[47];
assign o1[39] = i[15] ^ i[8] ^ i[20] ^ i[21];
assign o1[40] = i[23] ^ i[1] ^ i[7] ^ i[18];
assign o1[41] = i[2] ^ i[12] ^ i[9] ^ i[22];
assign o1[42] = i[17] ^ i[2] ^ i[3] ^ i[13];
assign o1[43] = i[20] ^ i[23] ^ i[10] ^ i[18];
assign o1[44] = i[15] ^ i[4] ^ i[8] ^ i[11];
assign o1[45] = i[12] ^ i[21] ^ i[3] ^ i[19];
assign o1[46] = i[16] ^ i[14] ^ i[15] ^ i[4];
assign o1[47] = i[9] ^ i[13] ^ i[20] ^ i[22];
assign o1[48] = i[16] ^ i[17] ^ i[5] ^ i[14];
assign o1[49] = i[15] ^ i[21] ^ i[23] ^ i[10];
assign o1[50] = i[6] ^ i[11] ^ i[12] ^ i[16];
assign o1[51] = i[7] ^ i[17] ^ i[11] ^ i[13];
assign o1[52] = i[8] ^ i[12] ^ i[24];
assign o1[53] = i[0] ^ i[1] ^ i[29];
assign o1[54] = i[1] ^ i[15] ^ i[30];
assign o1[55] = i[5] ^ i[21] ^ i[31];
assign o1[56] = i[3] ^ i[6] ^ i[32];
assign o1[57] = i[0] ^ i[9] ^ i[38];
assign o1[58] = i[4] ^ i[6] ^ i[39];
assign o1[59] = i[18] ^ i[19] ^ i[46];
assign o1[60] = i[17] ^ i[22] ^ i[54];
assign o1[61] = i[14] ^ i[23] ^ i[55];
assign o1[62] = i[2] ^ i[28];
assign o1[63] = i[7] ^ i[33];
assign o1[64] = i[8] ^ i[37];
assign o1[65] = i[0] ^ i[41];
assign o1[66] = i[16] ^ i[42];
assign o1[67] = i[2] ^ i[43];
assign o1[68] = i[20] ^ i[45];
//
// rerouted inputs that are to be grouped at level 2
//
assign o1[69] = i[26];  // row: 2
assign o1[70] = i[27];  // row: 3
assign o1[71] = i[35];  // row: 11
assign o1[72] = i[36];  // row: 12
assign o1[73] = i[40];  // row: 16
assign o1[74] = i[48];  // row: 24
assign o1[75] = i[49];  // row: 25
assign o1[76] = i[50];  // row: 26
assign o1[77] = i[51];  // row: 27
assign o1[78] = i[52];  // row: 28
assign o1[79] = i[53];  // row: 29

// Level 2 final outputs
// gals26_24_1L2_4;

assign o[0] = o1[0] ^ o1[52];
assign o[1] = o1[2] ^ o1[1];
assign o[2] = o1[4] ^ o1[3] ^ o1[69];
assign o[3] = o1[6] ^ o1[5] ^ o1[70];
assign o[4] = o1[8] ^ o1[62] ^ o1[7];
assign o[5] = o1[53] ^ o1[10] ^ o1[9];
assign o[6] = o1[54] ^ o1[12] ^ o1[11];
assign o[7] = o1[14] ^ o1[55] ^ o1[13];
assign o[8] = o1[56] ^ o1[16] ^ o1[15];
assign o[9] = o1[17] ^ o1[18] ^ o1[63];
assign o[10] = o1[19] ^ o1[20];
assign o[11] = o1[22] ^ o1[21] ^ o1[71];
assign o[12] = o1[24] ^ o1[23] ^ o1[72];
assign o[13] = o1[26] ^ o1[25] ^ o1[64];
assign o[14] = o1[57] ^ o1[19] ^ o1[27];
assign o[15] = o1[6] ^ o1[58] ^ o1[28];
assign o[16] = o1[21] ^ o1[23] ^ o1[29] ^ o1[73];
assign o[17] = o1[65] ^ o1[23] ^ o1[25] ^ o1[30];
assign o[18] = o1[31] ^ o1[25] ^ o1[32] ^ o1[66];
assign o[19] = o1[67] ^ o1[11] ^ o1[28] ^ o1[33];
assign o[20] = o1[35] ^ o1[13] ^ o1[34];
assign o[21] = o1[36] ^ o1[15] ^ o1[68];
assign o[22] = o1[17] ^ o1[37] ^ o1[59];
assign o[23] = o1[38] ^ o1[31] ^ o1[30];
assign o[24] = o1[26] ^ o1[40] ^ o1[39] ^ o1[74];
assign o[25] = o1[1] ^ o1[41] ^ o1[5] ^ o1[75];
assign o[26] = o1[42] ^ o1[7] ^ o1[43] ^ o1[76];
assign o[27] = o1[45] ^ o1[44] ^ o1[9] ^ o1[77];
assign o[28] = o1[46] ^ o1[11] ^ o1[47] ^ o1[78];
assign o[29] = o1[48] ^ o1[13] ^ o1[49] ^ o1[79];
assign o[30] = o1[50] ^ o1[15] ^ o1[60];
assign o[31] = o1[51] ^ o1[61];


endmodule
